package web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;

import org.primefaces.model.DualListModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import service.PapelUsuarioService;
import service.UsuarioService;
import util.UtilColecao;
import entity.PapelUsuario;
import entity.Usuario;

@Controller
@Scope("view")
public class AtribuirPapelUsuarioMB extends BaseManagedBean implements
		Serializable {

	private static final long serialVersionUID = 2980992478110115218L;

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	private PapelUsuarioService papelUsuarioService;

	private List<Usuario> listaUsuario;

	private List<PapelUsuario> listaPapelUsuario;

	private Usuario usuario;

	private DualListModel<PapelUsuario> papeisDualList;

	private List<PapelUsuario> listaPapeis;

	public AtribuirPapelUsuarioMB() {
	}

	@PostConstruct
	public void postConstruct() {
		iniciar();
	}

	public void doBuscarPapeisUsuario() {
		popularListaPapeis();
	}

	public void doSalvarAction() {
		usuario.setListaPapeisUsuario(papeisDualList.getTarget());
		usuarioService.salvar(usuario);
	}

	private void popularListaPapeis() {

		usuario = usuarioService.buscarPorChave(usuario.getId());
		if (!UtilColecao.isColecaoVazia(usuario.getListaPapeisUsuario())) {

			final List<PapelUsuario> papeisDisponiveis = new ArrayList<PapelUsuario>();
			for (PapelUsuario papelUsuario : listaPapeis) {
				if (!usuario.getListaPapeisUsuario().contains(papelUsuario)) {
					papeisDisponiveis.add(papelUsuario);
				}
			}
			papeisDualList = new DualListModel<PapelUsuario>(papeisDisponiveis,
					usuario.getListaPapeisUsuario());
		}

	}

	private void iniciar() {
		listaUsuario = usuarioService.listarAtivos();
		listaPapelUsuario = papelUsuarioService.listarAtivos();

		listaPapeis = papelUsuarioService.listarAtivos();

		papeisDualList = new DualListModel<PapelUsuario>(listaPapeis,
				new ArrayList<PapelUsuario>());

		usuario = new Usuario();
	}

	public List<Usuario> getListaUsuario() {
		return listaUsuario;
	}

	public void setListaUsuario(List<Usuario> listaUsuario) {
		this.listaUsuario = listaUsuario;
	}

	public List<PapelUsuario> getListaPapelUsuario() {
		return listaPapelUsuario;
	}

	public void setListaPapelUsuario(List<PapelUsuario> listaPapelUsuario) {
		this.listaPapelUsuario = listaPapelUsuario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public DualListModel<PapelUsuario> getPapeisDualList() {
		return papeisDualList;
	}

	public void setPapeisDualList(DualListModel<PapelUsuario> papeisDualList) {
		this.papeisDualList = papeisDualList;
	}
}
